#include <stdio.h>
#include <string.h>
#include <time.h>
#include "esp_log.h"
#include "esp_vfs_fat.h"
#include "esp_spiffs.h"
#include "sdkconfig.h"

static const char *TAG = "SPI_FLASH_EXAMPLE";

/**
 * @brief 应用程序主函数
 * 主要功能：初始化SPIFFS文件系统、读取文件内容、追加日期到文件并验证更新
 */
void app_main(void)
{
    // 初始化SPIFFS文件系统
    // 配置SPIFFS挂载参数
    esp_vfs_spiffs_conf_t conf = {
        .base_path = "/spiflash",     // 文件系统挂载点路径
        .partition_label = NULL,       // 使用默认分区，不指定标签
        .max_files = 5,               // 同时可打开的最大文件数
        .format_if_mount_failed = true // 挂载失败时自动格式化分区
    };

    ESP_LOGI(TAG, "Initializing SPIFFS");
    // 注册并挂载SPIFFS文件系统
    esp_err_t ret = esp_vfs_spiffs_register(&conf);
    if (ret != ESP_OK) {
        // 处理挂载失败的情况
        if (ret == ESP_FAIL) {
            ESP_LOGE(TAG, "Failed to mount or format filesystem");
        } else if (ret == ESP_ERR_NOT_FOUND) {
            ESP_LOGE(TAG, "Failed to find SPIFFS partition");
        } else {
            ESP_LOGE(TAG, "Failed to initialize SPIFFS (%s)", esp_err_to_name(ret));
        }
        return; // 初始化失败，退出函数
    }

    // 获取SPIFFS信息
    size_t total = 0, used = 0;
    ret = esp_spiffs_info(NULL, &total, &used);
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "Failed to get SPIFFS partition information (%s)", esp_err_to_name(ret));
    } else {
        ESP_LOGI(TAG, "Partition size: total: %d, used: %d", total, used);
    }

    // 文件路径
    const char *file_path = "/spiflash/example.txt";

    // 1. 读取文件内容并输出到日志
    FILE *f = fopen(file_path, "r"); // 以只读模式打开文件
    if (f == NULL) {
        ESP_LOGE(TAG, "Failed to open file for reading");
        esp_vfs_spiffs_unregister(NULL); // 打开失败，卸载文件系统
        return;                          // 退出函数
    }

    char line[256];
    ESP_LOGI(TAG, "Reading file content:");
    // 逐行读取文件内容
    while (fgets(line, sizeof(line), f) != NULL) {
        // 移除换行符和\r
        line[strcspn(line, "\r\n")] = 0;
        ESP_LOGI(TAG, "Read from file: %s", line);
    }
    fclose(f); // 关闭文件

    // 2. 获取当前日期
    time_t now;
    struct tm timeinfo;
    time(&now); // 获取当前时间戳
    localtime_r(&now, &timeinfo); // 转换为本地时间
    
    char date_str[64];
    // 格式化日期为YYYY-MM-DD格式
    strftime(date_str, sizeof(date_str), "%Y-%m-%d", &timeinfo);

    // 3. 追加日期到文件
    f = fopen(file_path, "a"); // 以追加模式打开文件
    if (f == NULL) {
        ESP_LOGE(TAG, "Failed to open file for appending");
        esp_vfs_spiffs_unregister(NULL); // 打开失败，卸载文件系统
        return;                          // 退出函数
    }

    fprintf(f, "%s\n", date_str); // 写入日期到文件
    fclose(f); // 关闭文件

    ESP_LOGI(TAG, "Date appended to file successfully");

    // 可选：重新读取并显示文件内容以验证
    f = fopen(file_path, "r");
    if (f != NULL) {
        ESP_LOGI(TAG, "File content after update:");
        // 逐行读取并显示更新后的文件内容
        while (fgets(line, sizeof(line), f) != NULL) {
            line[strcspn(line, "\r\n")] = 0;
            ESP_LOGI(TAG, "%s", line);
        }
        fclose(f);
    }

    // 卸载SPIFFS文件系统
    esp_vfs_spiffs_unregister(NULL);
    ESP_LOGI(TAG, "SPIFFS unmounted");
}